+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
+1999-11-04 Tor Lillqvist <tml@iki.fi>
+
+ * config.h.win32: Don't define HAVE_DIMM_H if MSC, as you have to
+ get the Platform SDK to get <dimm.h>.
+
+ * gdk/win32/gdkevents.c: More event handling fixes and
+ simplification. Never generate motion events with is_hint true. We
+ used to do that on bogus grounds earlier. Windows sends
+ WM_MOUSEMOVE messages on button events even if the mouse hasn't
+ moved, ignore these.
+
+ * gdk/win32/gdkfont.c: Load all fonts as (pretended) fontsets.
+
+ * gdk/win32/gdkglobals.c
+ * gdk/win32/gdkprivate.h: Define a typedef for the pointer to
+ the TrackMouseEvent function, and use it.
+
+ * gdk/win32/gdkwindow.c: Terminate widechar string with a zero
+ char before calling WideCharToMultiByte in order to get a string
+ for the window title.
+
+ * gdk/win32/gdkdnd.c: Some more random hacking, ifdeffed out.
+
+ * gdk/win32/gdk.def: Remove obsolete functions.
+
+ * gdk/win32/makefile.{cygwin,msc}: Remove gdkcompat.{o,obj}. Add
+ /nodefaultlib and /defaultlib switches.
+
+ * gtk/gtkrc.c: s/gwin_getlocale/g_win32_getlocale/.
+
1999-10-31 Tor Lillqvist <tml@iki.fi>
* gdk/gdkkeysyms.h: Add new keysyms from X11R6.4 (including
/* Define if you have the <dimm.h> header file
* (available in the Platform SDK)
*/
-#ifdef _MSC_VER
-#define HAVE_DIMM_H 1
-#endif
+/* #define HAVE_DIMM_H 1 */
gdk_window_clear
gdk_window_clear_area
gdk_window_clear_area_e
- gdk_window_copy_area
gdk_window_destroy
gdk_window_foreign_new
gdk_window_get_deskrelative_origin
gdk_window_get_children
- gdk_window_get_colormap
gdk_window_get_events
gdk_window_get_geometry
gdk_window_get_origin
gdk_window_get_pointer
gdk_window_get_position
gdk_window_get_root_origin
- gdk_window_get_size
gdk_window_get_toplevel
gdk_window_get_toplevels
- gdk_window_get_type
gdk_window_get_user_data
- gdk_window_get_visual
gdk_window_hide
gdk_window_is_visible
gdk_window_is_viewable
gdk_window_set_back_pixmap
gdk_window_set_background
gdk_window_set_child_shapes
- gdk_window_set_colormap
gdk_window_set_cursor
gdk_window_set_decorations
gdk_window_set_events
gdk_window_clear
gdk_window_clear_area
gdk_window_clear_area_e
- gdk_window_copy_area
gdk_window_destroy
gdk_window_foreign_new
gdk_window_get_deskrelative_origin
gdk_window_get_children
- gdk_window_get_colormap
gdk_window_get_events
gdk_window_get_geometry
gdk_window_get_origin
gdk_window_get_pointer
gdk_window_get_position
gdk_window_get_root_origin
- gdk_window_get_size
gdk_window_get_toplevel
gdk_window_get_toplevels
- gdk_window_get_type
gdk_window_get_user_data
- gdk_window_get_visual
gdk_window_hide
gdk_window_is_visible
gdk_window_is_viewable
gdk_window_set_back_pixmap
gdk_window_set_background
gdk_window_set_child_shapes
- gdk_window_set_colormap
gdk_window_set_cursor
gdk_window_set_decorations
gdk_window_set_events
#include <string.h>
+/* #define OLE2_DND */
+
#define INITGUID
#include "gdkdnd.h"
#include <shlguid.h>
#endif
+#ifndef _MSC_VER
+static IID IID_IUnknown = {
+ 0x00000000, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropSource = {
+ 0x00000121, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropTarget = {
+ 0x00000122, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+#endif
+
#include <gdk/gdk.h>
typedef struct _GdkDragContextPrivate GdkDragContextPrivate;
#ifdef OLE2_DND
-#define PRINT_RIID(riid) \
- g_print ("riid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
- ((gulong *) riid)[0], \
- ((gushort *) riid)[2], \
- ((gushort *) riid)[3], \
- ((guchar *) riid)[8], \
- ((guchar *) riid)[9], \
- ((guchar *) riid)[10], \
- ((guchar *) riid)[11], \
- ((guchar *) riid)[12], \
- ((guchar *) riid)[13], \
- ((guchar *) riid)[14], \
- ((guchar *) riid)[15]);
-
-
-HRESULT STDMETHODCALLTYPE
- m_query_interface_target (IDropTarget __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
- m_add_ref_target (IDropTarget __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
- m_release_target (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
- m_drag_enter (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
- m_drag_over (IDropTarget __RPC_FAR *This,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
- m_drag_leave (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
- m_drop (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
- m_query_interface_source (IDropSource __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
- m_add_ref_source (IDropSource __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
- m_release_source (IDropSource __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
- m_query_continue_drag (IDropSource __RPC_FAR *This,
- /* [in] */ BOOL fEscapePressed,
- /* [in] */ DWORD grfKeyState);
-HRESULT STDMETHODCALLTYPE
- m_give_feedback (IDropSource __RPC_FAR *This,
- /* [in] */ DWORD dwEffect);
+#define PRINT_GUID(guid) \
+ g_print ("guid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
+ ((gulong *) guid)[0], \
+ ((gushort *) guid)[2], \
+ ((gushort *) guid)[3], \
+ ((guchar *) guid)[8], \
+ ((guchar *) guid)[9], \
+ ((guchar *) guid)[10], \
+ ((guchar *) guid)[11], \
+ ((guchar *) guid)[12], \
+ ((guchar *) guid)[13], \
+ ((guchar *) guid)[14], \
+ ((guchar *) guid)[15]);
+
#endif /* OLE2_DND */
return (GdkDragContext *)result;
}
-#ifdef OLE2_DND
+void
+gdk_drag_context_ref (GdkDragContext *context)
+{
+ g_return_if_fail (context != NULL);
+
+ ((GdkDragContextPrivate *)context)->ref_count++;
+}
+
+void
+gdk_drag_context_unref (GdkDragContext *context)
+{
+ GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
+
+ g_return_if_fail (context != NULL);
+
+ private->ref_count--;
+
+ GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
+ private->ref_count,
+ (private->ref_count == 0 ? " freeing" : "")));
+
+ if (private->ref_count == 0)
+ {
+ g_dataset_destroy (private);
+
+ g_list_free (context->targets);
+
+ if (context->source_window)
+ gdk_window_unref (context->source_window);
+
+ if (context->dest_window)
+ gdk_window_unref (context->dest_window);
+
+ contexts = g_list_remove (contexts, private);
+ g_free (private);
+ }
+}
+
+#if 0
+
+static GdkDragContext *
+gdk_drag_context_find (gboolean is_source,
+ HWND source_xid,
+ HWND dest_xid)
+{
+ GList *tmp_list = contexts;
+ GdkDragContext *context;
+
+ while (tmp_list)
+ {
+ context = (GdkDragContext *)tmp_list->data;
+
+ if ((!context->is_source == !is_source) &&
+ ((source_xid == None) || (context->source_window &&
+ (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
+ ((dest_xid == None) || (context->dest_window &&
+ (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
+ return context;
+
+ tmp_list = tmp_list->next;
+ }
+
+ return NULL;
+}
+
+#endif
typedef struct {
+#ifdef OLE2_DND
IDropTarget idt;
+#endif
GdkDragContext *context;
} target_drag_context;
typedef struct {
+#ifdef OLE2_DND
IDropSource ids;
+#endif
GdkDragContext *context;
} source_drag_context;
-HRESULT STDMETHODCALLTYPE
+#ifdef OLE2_DND
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_target (IDropTarget __RPC_FAR *This)
+{
+ target_drag_context *ctx = (target_drag_context *) This;
+ GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+ GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
+ gdk_drag_context_ref (ctx->context);
+
+ return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
m_query_interface_target (IDropTarget __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+ REFIID riid,
+ void __RPC_FAR *__RPC_FAR *ppvObject)
{
GDK_NOTE (DND, g_print ("m_query_interface_target\n"));
*ppvObject = NULL;
- PRINT_RIID (riid);
+ PRINT_GUID (riid);
if (IsEqualGUID (riid, &IID_IUnknown))
{
}
}
-ULONG STDMETHODCALLTYPE
-m_add_ref_target (IDropTarget __RPC_FAR *This)
-{
- target_drag_context *ctx = (target_drag_context *) This;
- GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
- GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
- gdk_drag_context_ref (ctx->context);
-
- return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
m_release_target (IDropTarget __RPC_FAR *This)
{
target_drag_context *ctx = (target_drag_context *) This;
return private->ref_count - 1;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drag_enter (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ IDataObject __RPC_FAR *pDataObj,
+ DWORD grfKeyState,
+ POINTL pt,
+ DWORD __RPC_FAR *pdwEffect)
{
GDK_NOTE (DND, g_print ("m_drag_enter\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drag_over (IDropTarget __RPC_FAR *This,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ DWORD grfKeyState,
+ POINTL pt,
+ DWORD __RPC_FAR *pdwEffect)
{
GDK_NOTE (DND, g_print ("m_drag_over\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drag_leave (IDropTarget __RPC_FAR *This)
{
GDK_NOTE (DND, g_print ("m_drag_leave\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drop (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ IDataObject __RPC_FAR *pDataObj,
+ DWORD grfKeyState,
+ POINTL pt,
+ DWORD __RPC_FAR *pdwEffect)
{
GDK_NOTE (DND, g_print ("m_drop\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
+m_add_ref_source (IDropSource __RPC_FAR *This)
+{
+ source_drag_context *ctx = (source_drag_context *) This;
+ GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+ GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
+ gdk_drag_context_ref (ctx->context);
+
+ return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
m_query_interface_source (IDropSource __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+ REFIID riid,
+ void __RPC_FAR *__RPC_FAR *ppvObject)
{
GDK_NOTE (DND, g_print ("m_query_interface_source\n"));
*ppvObject = NULL;
- PRINT_RIID (riid);
+ PRINT_GUID (riid);
if (IsEqualGUID (riid, &IID_IUnknown))
{
g_print ("...IUnknown\n");
}
}
-ULONG STDMETHODCALLTYPE
-m_add_ref_source (IDropSource __RPC_FAR *This)
-{
- source_drag_context *ctx = (source_drag_context *) This;
- GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
- GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
- gdk_drag_context_ref (ctx->context);
-
- return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
m_release_source (IDropSource __RPC_FAR *This)
{
source_drag_context *ctx = (source_drag_context *) This;
return private->ref_count - 1;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_query_continue_drag (IDropSource __RPC_FAR *This,
- /* [in] */ BOOL fEscapePressed,
- /* [in] */ DWORD grfKeyState)
+ BOOL fEscapePressed,
+ DWORD grfKeyState)
{
GDK_NOTE (DND, g_print ("m_query_continue_drag\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_give_feedback (IDropSource __RPC_FAR *This,
- /* [in] */ DWORD dwEffect)
+ DWORD dwEffect)
{
GDK_NOTE (DND, g_print ("m_give_feedback\n"));
return E_UNEXPECTED;
}
+static HRESULT STDMETHODCALLTYPE
+m_query_interface_object (IDataObject __RPC_FAR *This,
+ REFIID riid,
+ void __RPC_FAR *__RPC_FAR *ppvObject)
+{
+ return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_object (IDataObject __RPC_FAR *This)
+{
+ return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_release_object (IDataObject __RPC_FAR *This)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc,
+ STGMEDIUM *pMedium)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data_here (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc,
+ STGMEDIUM *pMedium)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_query_get_data (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_canonical_format_etc (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtcIn,
+ FORMATETC *pFormatEtcOut)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_set_data (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc,
+ STGMEDIUM *pMedium,
+ BOOL fRelease)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_format_etc (IDataObject __RPC_FAR *This,
+ DWORD dwDirection,
+ IEnumFORMATETC **ppEnumFormatEtc)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_advise (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatetc,
+ DWORD advf,
+ IAdviseSink *pAdvSink,
+ DWORD *pdwConnection)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_unadvise (IDataObject __RPC_FAR *This,
+ DWORD dwConnection)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_d_advise (IDataObject __RPC_FAR *This,
+ IEnumSTATDATA **ppenumAdvise)
+{
+ return E_UNEXPECTED;
+}
+
static IDropTargetVtbl idt_vtbl = {
m_query_interface_target,
m_add_ref_target,
m_give_feedback
};
-target_drag_context *
+static IDataObjectVtbl ido_vtbl = {
+ m_query_interface_object,
+ m_add_ref_object,
+ m_release_object,
+ m_get_data,
+ m_get_data_here,
+ m_query_get_data,
+ m_get_canonical_format_etc,
+ m_set_data,
+ m_enum_format_etc,
+ m_d_advise,
+ m_d_unadvise,
+ m_enum_d_advise
+};
+
+#endif /* OLE2_DND */
+
+static target_drag_context *
target_context_new (void)
{
target_drag_context *result;
result = g_new0 (target_drag_context, 1);
+#ifdef OLE2_DND
result->idt.lpVtbl = &idt_vtbl;
+#endif
result->context = gdk_drag_context_new ();
return result;
}
-source_drag_context *
+static source_drag_context *
source_context_new (void)
{
source_drag_context *result;
result = g_new0 (source_drag_context, 1);
+#ifdef OLE2_DND
result->ids.lpVtbl = &ids_vtbl;
+#endif
result->context = gdk_drag_context_new ();
return result;
}
-#endif /* OLE2_DND */
-
-void
-gdk_drag_context_ref (GdkDragContext *context)
-{
- g_return_if_fail (context != NULL);
-
- ((GdkDragContextPrivate *)context)->ref_count++;
-}
-
-void
-gdk_drag_context_unref (GdkDragContext *context)
-{
- GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
-
- g_return_if_fail (context != NULL);
-
- private->ref_count--;
-
- GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
- private->ref_count,
- (private->ref_count == 0 ? " freeing" : "")));
-
- if (private->ref_count == 0)
- {
- g_dataset_destroy (private);
-
- g_list_free (context->targets);
-
- if (context->source_window)
- gdk_window_unref (context->source_window);
-
- if (context->dest_window)
- gdk_window_unref (context->dest_window);
-
- contexts = g_list_remove (contexts, private);
- g_free (private);
- }
-}
-
-#if 0
-
-static GdkDragContext *
-gdk_drag_context_find (gboolean is_source,
- HWND source_xid,
- HWND dest_xid)
-{
- GList *tmp_list = contexts;
- GdkDragContext *context;
-
- while (tmp_list)
- {
- context = (GdkDragContext *)tmp_list->data;
-
- if ((!context->is_source == !is_source) &&
- ((source_xid == None) || (context->source_window &&
- (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
- ((dest_xid == None) || (context->dest_window &&
- (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
- return context;
-
- tmp_list = tmp_list->next;
- }
-
- return NULL;
-}
-
-#endif
-
#ifdef _MSC_VER
/* From MS Knowledge Base article Q130698 */
GList *targets)
{
GList *tmp_list;
- GdkDragContext *new_context;
+ source_drag_context *ctx;
g_return_val_if_fail (window != NULL, NULL);
GDK_NOTE (DND, g_print ("gdk_drag_begin\n"));
- new_context = gdk_drag_context_new ();
- new_context->is_source = TRUE;
- new_context->source_window = window;
+ ctx = source_context_new ();
+ ctx->context->is_source = TRUE;
+ ctx->context->source_window = window;
gdk_window_ref (window);
tmp_list = g_list_last (targets);
- new_context->targets = NULL;
+ ctx->context->targets = NULL;
while (tmp_list)
{
- new_context->targets = g_list_prepend (new_context->targets,
- tmp_list->data);
+ ctx->context->targets = g_list_prepend (ctx->context->targets,
+ tmp_list->data);
tmp_list = tmp_list->prev;
}
- new_context->actions = 0;
+ ctx->context->actions = 0;
- return new_context;
+#if 0
+ DoDragDrop (...);
+#endif
+ return ctx->context;
}
guint32
#include <string.h>
+/* #define OLE2_DND */
+
#define INITGUID
#include "gdkdnd.h"
#include <shlguid.h>
#endif
+#ifndef _MSC_VER
+static IID IID_IUnknown = {
+ 0x00000000, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropSource = {
+ 0x00000121, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+static IID IID_IDropTarget = {
+ 0x00000122, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
+#endif
+
#include <gdk/gdk.h>
typedef struct _GdkDragContextPrivate GdkDragContextPrivate;
#ifdef OLE2_DND
-#define PRINT_RIID(riid) \
- g_print ("riid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
- ((gulong *) riid)[0], \
- ((gushort *) riid)[2], \
- ((gushort *) riid)[3], \
- ((guchar *) riid)[8], \
- ((guchar *) riid)[9], \
- ((guchar *) riid)[10], \
- ((guchar *) riid)[11], \
- ((guchar *) riid)[12], \
- ((guchar *) riid)[13], \
- ((guchar *) riid)[14], \
- ((guchar *) riid)[15]);
-
-
-HRESULT STDMETHODCALLTYPE
- m_query_interface_target (IDropTarget __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
- m_add_ref_target (IDropTarget __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
- m_release_target (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
- m_drag_enter (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
- m_drag_over (IDropTarget __RPC_FAR *This,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
- m_drag_leave (IDropTarget __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
- m_drop (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-
-HRESULT STDMETHODCALLTYPE
- m_query_interface_source (IDropSource __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
-ULONG STDMETHODCALLTYPE
- m_add_ref_source (IDropSource __RPC_FAR *This);
-
-ULONG STDMETHODCALLTYPE
- m_release_source (IDropSource __RPC_FAR *This);
-
-HRESULT STDMETHODCALLTYPE
- m_query_continue_drag (IDropSource __RPC_FAR *This,
- /* [in] */ BOOL fEscapePressed,
- /* [in] */ DWORD grfKeyState);
-HRESULT STDMETHODCALLTYPE
- m_give_feedback (IDropSource __RPC_FAR *This,
- /* [in] */ DWORD dwEffect);
+#define PRINT_GUID(guid) \
+ g_print ("guid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
+ ((gulong *) guid)[0], \
+ ((gushort *) guid)[2], \
+ ((gushort *) guid)[3], \
+ ((guchar *) guid)[8], \
+ ((guchar *) guid)[9], \
+ ((guchar *) guid)[10], \
+ ((guchar *) guid)[11], \
+ ((guchar *) guid)[12], \
+ ((guchar *) guid)[13], \
+ ((guchar *) guid)[14], \
+ ((guchar *) guid)[15]);
+
#endif /* OLE2_DND */
return (GdkDragContext *)result;
}
-#ifdef OLE2_DND
+void
+gdk_drag_context_ref (GdkDragContext *context)
+{
+ g_return_if_fail (context != NULL);
+
+ ((GdkDragContextPrivate *)context)->ref_count++;
+}
+
+void
+gdk_drag_context_unref (GdkDragContext *context)
+{
+ GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
+
+ g_return_if_fail (context != NULL);
+
+ private->ref_count--;
+
+ GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
+ private->ref_count,
+ (private->ref_count == 0 ? " freeing" : "")));
+
+ if (private->ref_count == 0)
+ {
+ g_dataset_destroy (private);
+
+ g_list_free (context->targets);
+
+ if (context->source_window)
+ gdk_window_unref (context->source_window);
+
+ if (context->dest_window)
+ gdk_window_unref (context->dest_window);
+
+ contexts = g_list_remove (contexts, private);
+ g_free (private);
+ }
+}
+
+#if 0
+
+static GdkDragContext *
+gdk_drag_context_find (gboolean is_source,
+ HWND source_xid,
+ HWND dest_xid)
+{
+ GList *tmp_list = contexts;
+ GdkDragContext *context;
+
+ while (tmp_list)
+ {
+ context = (GdkDragContext *)tmp_list->data;
+
+ if ((!context->is_source == !is_source) &&
+ ((source_xid == None) || (context->source_window &&
+ (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
+ ((dest_xid == None) || (context->dest_window &&
+ (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
+ return context;
+
+ tmp_list = tmp_list->next;
+ }
+
+ return NULL;
+}
+
+#endif
typedef struct {
+#ifdef OLE2_DND
IDropTarget idt;
+#endif
GdkDragContext *context;
} target_drag_context;
typedef struct {
+#ifdef OLE2_DND
IDropSource ids;
+#endif
GdkDragContext *context;
} source_drag_context;
-HRESULT STDMETHODCALLTYPE
+#ifdef OLE2_DND
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_target (IDropTarget __RPC_FAR *This)
+{
+ target_drag_context *ctx = (target_drag_context *) This;
+ GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+ GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
+ gdk_drag_context_ref (ctx->context);
+
+ return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
m_query_interface_target (IDropTarget __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+ REFIID riid,
+ void __RPC_FAR *__RPC_FAR *ppvObject)
{
GDK_NOTE (DND, g_print ("m_query_interface_target\n"));
*ppvObject = NULL;
- PRINT_RIID (riid);
+ PRINT_GUID (riid);
if (IsEqualGUID (riid, &IID_IUnknown))
{
}
}
-ULONG STDMETHODCALLTYPE
-m_add_ref_target (IDropTarget __RPC_FAR *This)
-{
- target_drag_context *ctx = (target_drag_context *) This;
- GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
- GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
- gdk_drag_context_ref (ctx->context);
-
- return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
m_release_target (IDropTarget __RPC_FAR *This)
{
target_drag_context *ctx = (target_drag_context *) This;
return private->ref_count - 1;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drag_enter (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ IDataObject __RPC_FAR *pDataObj,
+ DWORD grfKeyState,
+ POINTL pt,
+ DWORD __RPC_FAR *pdwEffect)
{
GDK_NOTE (DND, g_print ("m_drag_enter\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drag_over (IDropTarget __RPC_FAR *This,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ DWORD grfKeyState,
+ POINTL pt,
+ DWORD __RPC_FAR *pdwEffect)
{
GDK_NOTE (DND, g_print ("m_drag_over\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drag_leave (IDropTarget __RPC_FAR *This)
{
GDK_NOTE (DND, g_print ("m_drag_leave\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_drop (IDropTarget __RPC_FAR *This,
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ IDataObject __RPC_FAR *pDataObj,
+ DWORD grfKeyState,
+ POINTL pt,
+ DWORD __RPC_FAR *pdwEffect)
{
GDK_NOTE (DND, g_print ("m_drop\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
+m_add_ref_source (IDropSource __RPC_FAR *This)
+{
+ source_drag_context *ctx = (source_drag_context *) This;
+ GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
+
+ GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
+ gdk_drag_context_ref (ctx->context);
+
+ return private->ref_count;
+}
+
+static HRESULT STDMETHODCALLTYPE
m_query_interface_source (IDropSource __RPC_FAR *This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+ REFIID riid,
+ void __RPC_FAR *__RPC_FAR *ppvObject)
{
GDK_NOTE (DND, g_print ("m_query_interface_source\n"));
*ppvObject = NULL;
- PRINT_RIID (riid);
+ PRINT_GUID (riid);
if (IsEqualGUID (riid, &IID_IUnknown))
{
g_print ("...IUnknown\n");
}
}
-ULONG STDMETHODCALLTYPE
-m_add_ref_source (IDropSource __RPC_FAR *This)
-{
- source_drag_context *ctx = (source_drag_context *) This;
- GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
-
- GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
- gdk_drag_context_ref (ctx->context);
-
- return private->ref_count;
-}
-
-ULONG STDMETHODCALLTYPE
+static ULONG STDMETHODCALLTYPE
m_release_source (IDropSource __RPC_FAR *This)
{
source_drag_context *ctx = (source_drag_context *) This;
return private->ref_count - 1;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_query_continue_drag (IDropSource __RPC_FAR *This,
- /* [in] */ BOOL fEscapePressed,
- /* [in] */ DWORD grfKeyState)
+ BOOL fEscapePressed,
+ DWORD grfKeyState)
{
GDK_NOTE (DND, g_print ("m_query_continue_drag\n"));
return E_UNEXPECTED;
}
-HRESULT STDMETHODCALLTYPE
+static HRESULT STDMETHODCALLTYPE
m_give_feedback (IDropSource __RPC_FAR *This,
- /* [in] */ DWORD dwEffect)
+ DWORD dwEffect)
{
GDK_NOTE (DND, g_print ("m_give_feedback\n"));
return E_UNEXPECTED;
}
+static HRESULT STDMETHODCALLTYPE
+m_query_interface_object (IDataObject __RPC_FAR *This,
+ REFIID riid,
+ void __RPC_FAR *__RPC_FAR *ppvObject)
+{
+ return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_add_ref_object (IDataObject __RPC_FAR *This)
+{
+ return E_UNEXPECTED;
+}
+
+static ULONG STDMETHODCALLTYPE
+m_release_object (IDataObject __RPC_FAR *This)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc,
+ STGMEDIUM *pMedium)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_data_here (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc,
+ STGMEDIUM *pMedium)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_query_get_data (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_get_canonical_format_etc (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtcIn,
+ FORMATETC *pFormatEtcOut)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_set_data (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatEtc,
+ STGMEDIUM *pMedium,
+ BOOL fRelease)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_format_etc (IDataObject __RPC_FAR *This,
+ DWORD dwDirection,
+ IEnumFORMATETC **ppEnumFormatEtc)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_advise (IDataObject __RPC_FAR *This,
+ FORMATETC *pFormatetc,
+ DWORD advf,
+ IAdviseSink *pAdvSink,
+ DWORD *pdwConnection)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+ m_d_unadvise (IDataObject __RPC_FAR *This,
+ DWORD dwConnection)
+{
+ return E_UNEXPECTED;
+}
+
+static HRESULT STDMETHODCALLTYPE
+m_enum_d_advise (IDataObject __RPC_FAR *This,
+ IEnumSTATDATA **ppenumAdvise)
+{
+ return E_UNEXPECTED;
+}
+
static IDropTargetVtbl idt_vtbl = {
m_query_interface_target,
m_add_ref_target,
m_give_feedback
};
-target_drag_context *
+static IDataObjectVtbl ido_vtbl = {
+ m_query_interface_object,
+ m_add_ref_object,
+ m_release_object,
+ m_get_data,
+ m_get_data_here,
+ m_query_get_data,
+ m_get_canonical_format_etc,
+ m_set_data,
+ m_enum_format_etc,
+ m_d_advise,
+ m_d_unadvise,
+ m_enum_d_advise
+};
+
+#endif /* OLE2_DND */
+
+static target_drag_context *
target_context_new (void)
{
target_drag_context *result;
result = g_new0 (target_drag_context, 1);
+#ifdef OLE2_DND
result->idt.lpVtbl = &idt_vtbl;
+#endif
result->context = gdk_drag_context_new ();
return result;
}
-source_drag_context *
+static source_drag_context *
source_context_new (void)
{
source_drag_context *result;
result = g_new0 (source_drag_context, 1);
+#ifdef OLE2_DND
result->ids.lpVtbl = &ids_vtbl;
+#endif
result->context = gdk_drag_context_new ();
return result;
}
-#endif /* OLE2_DND */
-
-void
-gdk_drag_context_ref (GdkDragContext *context)
-{
- g_return_if_fail (context != NULL);
-
- ((GdkDragContextPrivate *)context)->ref_count++;
-}
-
-void
-gdk_drag_context_unref (GdkDragContext *context)
-{
- GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
-
- g_return_if_fail (context != NULL);
-
- private->ref_count--;
-
- GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
- private->ref_count,
- (private->ref_count == 0 ? " freeing" : "")));
-
- if (private->ref_count == 0)
- {
- g_dataset_destroy (private);
-
- g_list_free (context->targets);
-
- if (context->source_window)
- gdk_window_unref (context->source_window);
-
- if (context->dest_window)
- gdk_window_unref (context->dest_window);
-
- contexts = g_list_remove (contexts, private);
- g_free (private);
- }
-}
-
-#if 0
-
-static GdkDragContext *
-gdk_drag_context_find (gboolean is_source,
- HWND source_xid,
- HWND dest_xid)
-{
- GList *tmp_list = contexts;
- GdkDragContext *context;
-
- while (tmp_list)
- {
- context = (GdkDragContext *)tmp_list->data;
-
- if ((!context->is_source == !is_source) &&
- ((source_xid == None) || (context->source_window &&
- (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
- ((dest_xid == None) || (context->dest_window &&
- (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
- return context;
-
- tmp_list = tmp_list->next;
- }
-
- return NULL;
-}
-
-#endif
-
#ifdef _MSC_VER
/* From MS Knowledge Base article Q130698 */
GList *targets)
{
GList *tmp_list;
- GdkDragContext *new_context;
+ source_drag_context *ctx;
g_return_val_if_fail (window != NULL, NULL);
GDK_NOTE (DND, g_print ("gdk_drag_begin\n"));
- new_context = gdk_drag_context_new ();
- new_context->is_source = TRUE;
- new_context->source_window = window;
+ ctx = source_context_new ();
+ ctx->context->is_source = TRUE;
+ ctx->context->source_window = window;
gdk_window_ref (window);
tmp_list = g_list_last (targets);
- new_context->targets = NULL;
+ ctx->context->targets = NULL;
while (tmp_list)
{
- new_context->targets = g_list_prepend (new_context->targets,
- tmp_list->data);
+ ctx->context->targets = g_list_prepend (ctx->context->targets,
+ tmp_list->data);
tmp_list = tmp_list->prev;
}
- new_context->actions = 0;
+ ctx->context->actions = 0;
- return new_context;
+#if 0
+ DoDragDrop (...);
+#endif
+ return ctx->context;
}
guint32
#include <windows.h>
-#ifdef HAVE_WINTAB
-#include <wintab.h>
-#endif
-
#include <objbase.h>
#include <imm.h>
#include "surrogate-dimm.h"
#endif
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#endif
+
#include "gdk.h"
#include "gdkx.h"
#endif
}
-/************************
- * Exposure compression *
- ************************/
-
-/* I don't bother with exposure compression on Win32. Windows compresses
- * WM_PAINT events by itself.
- */
-
/*************************************************************
* gdk_event_handler_set:
*
}
}
+static gint
+build_pointer_event_state (MSG *xevent)
+{
+ gint state;
+
+ state = 0;
+ if (xevent->wParam & MK_CONTROL)
+ state |= GDK_CONTROL_MASK;
+ if (xevent->wParam & MK_LBUTTON)
+ state |= GDK_BUTTON1_MASK;
+ if (xevent->wParam & MK_MBUTTON)
+ state |= GDK_BUTTON2_MASK;
+ if (xevent->wParam & MK_RBUTTON)
+ state |= GDK_BUTTON3_MASK;
+ if (xevent->wParam & MK_SHIFT)
+ state |= GDK_SHIFT_MASK;
+ if (GetKeyState (VK_MENU) < 0)
+ state |= GDK_MOD1_MASK;
+ if (GetKeyState (VK_CAPITAL) & 0x1)
+ state |= GDK_LOCK_MASK;
+
+ return state;
+}
+
+
static void
build_keypress_event (GdkWindowPrivate *window_private,
GdkEvent *event,
event->expose.count);
break;
case GDK_MOTION_NOTIFY:
+ g_print ("(%.4g,%.4g) %s",
+ event->motion.x, event->motion.y,
+ event->motion.is_hint ? "HINT " : "");
print_event_state (event->motion.state);
break;
case GDK_BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS:
+ case GDK_3BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
- g_print ("%d ", event->button.button);
+ g_print ("%d (%.4g,%.4g) ",
+ event->button.button,
+ event->button.x, event->button.y);
print_event_state (event->button.state);
break;
case GDK_KEY_PRESS:
synthesize_crossing_events (GdkWindow *window,
MSG *xevent)
{
- TRACKMOUSEEVENT tme;
GdkEvent *event;
/* If we are not using TrackMouseEvent, generate a leave notify
gdk_window_unref (curWnd);
curWnd = window;
gdk_window_ref (curWnd);
+#ifdef USE_TRACKMOUSEEVENT
if (p_TrackMouseEvent != NULL)
{
+ TRACKMOUSEEVENT tme;
+
tme.cbSize = sizeof (TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = GDK_DRAWABLE_XID (curWnd);
(*p_TrackMouseEvent) (&tme);
}
+#endif
}
+#ifndef NEW_PROPAGATION_CODE
+
static GdkWindow *
key_propagate (GdkWindow *window,
MSG *xevent)
gdk_window_unref (window);
window = WINDOW_PRIVATE(window)->parent;
gdk_window_ref (window);
- GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
- GDK_DRAWABLE_XID (window)));
return window;
}
static GdkWindow *
-mouse_propagate (GdkWindow *window,
- MSG *xevent)
+pointer_propagate (GdkWindow *window,
+ MSG *xevent)
{
POINT pt;
gdk_window_ref (window);
ScreenToClient (GDK_DRAWABLE_XID (window), &pt);
xevent->lParam = MAKELPARAM (pt.x, pt.y);
- GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
- GDK_DRAWABLE_XID (window)));
+
return window;
}
+#endif /* !NEW_PROPAGATION_CODE */
+
+static void
+translate_mouse_coords (GdkWindow *window1,
+ GdkWindow *window2,
+ MSG *xevent)
+{
+ POINT pt;
+
+ pt.x = LOWORD (xevent->lParam);
+ pt.y = HIWORD (xevent->lParam);
+ ClientToScreen (GDK_DRAWABLE_XID (window1), &pt);
+ ScreenToClient (GDK_DRAWABLE_XID (window2), &pt);
+ xevent->lParam = MAKELPARAM (pt.x, pt.y);
+ GDK_NOTE (EVENTS, g_print ("...new coords are (%d,%d)\n", pt.x, pt.y));
+}
+
#ifdef NEW_PROPAGATION_CODE
static gboolean
gboolean grab_owner_events,
gint grab_mask,
gboolean (*doesnt_want_it) (gint mask,
- MSG *xevent),
- GdkWindow *(*propagate) (GdkWindow *window,
- MSG *xevent))
+ MSG *xevent))
{
if (grab_window != NULL && !grab_owner_events)
{
}
else
{
- GDK_NOTE (EVENTS, "...undelivered\n");
+ GDK_NOTE (EVENTS, g_print ("...undelivered\n"));
return FALSE;
}
}
else
{
- *window = (*propagate) (*window, xevent);
+ gdk_window_unref (*window);
+ *window = WINDOW_PRIVATE(*window)->parent;
+ gdk_window_ref (*window);
GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
GDK_DRAWABLE_XID (*window)));
/* The only branch where we actually continue the loop */
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
- doesnt_want_key,
- key_propagate))
+ doesnt_want_key))
break;
event->key.window = window;
#else
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
- doesnt_want_char,
- key_propagate))
+ doesnt_want_char))
break;
event->key.window = window;
#else
buttondown0:
GDK_NOTE (EVENTS,
- g_print ("WM_%cBUTTONDOWN: %#x x,y: %d %d button: %d\n",
+ g_print ("WM_%cBUTTONDOWN: %#x (%d,%d)\n",
" LMR"[button],
xevent->hwnd,
- LOWORD (xevent->lParam), HIWORD (xevent->lParam),
- button));
+ LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
if (WINDOW_PRIVATE(window)->extension_events != 0
&& gdk_input_ignore_core)
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
p_grab_window, p_grab_owner_events, p_grab_mask,
- doesnt_want_button_press,
- mouse_propagate))
+ doesnt_want_button_press))
break;
event->button.window = window;
#else
}
else
{
- window = mouse_propagate (window, xevent);
+ window = pointer_propagate (window, xevent);
/* Jump back up */
goto buttondown; /* What did Dijkstra say? */
}
}
event->button.time = xevent->time;
- if (window == p_grab_window
- && p_grab_window != orig_window)
- {
- /* Translate coordinates to grabber */
- pt.x = LOWORD (xevent->lParam);
- pt.y = HIWORD (xevent->lParam);
- ClientToScreen (xevent->hwnd, &pt);
- ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
- event->button.x = pt.x;
- event->button.y = pt.y;
- GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
- }
- else
- {
- event->button.x = LOWORD (xevent->lParam);
- event->button.y = HIWORD (xevent->lParam);
- }
+ if (window != orig_window)
+ translate_mouse_coords (orig_window, window, xevent);
+ event->button.x = curX = LOWORD (xevent->lParam);
+ event->button.y = curY = HIWORD (xevent->lParam);
event->button.x_root = xevent->pt.x;
event->button.y_root = xevent->pt.y;
event->button.pressure = 0.5;
event->button.xtilt = 0;
event->button.ytilt = 0;
- event->button.state = 0;
- if (xevent->wParam & MK_CONTROL)
- event->button.state |= GDK_CONTROL_MASK;
- if (xevent->wParam & MK_LBUTTON)
- event->button.state |= GDK_BUTTON1_MASK;
- if (xevent->wParam & MK_MBUTTON)
- event->button.state |= GDK_BUTTON2_MASK;
- if (xevent->wParam & MK_RBUTTON)
- event->button.state |= GDK_BUTTON3_MASK;
- if (xevent->wParam & MK_SHIFT)
- event->button.state |= GDK_SHIFT_MASK;
- if (GetKeyState (VK_MENU) < 0)
- event->button.state |= GDK_MOD1_MASK;
- if (GetKeyState (VK_CAPITAL) & 0x1)
- event->button.state |= GDK_LOCK_MASK;
+ event->button.state = build_pointer_event_state (xevent);
event->button.button = button;
event->button.source = GDK_SOURCE_MOUSE;
event->button.deviceid = GDK_CORE_POINTER;
buttonup0:
GDK_NOTE (EVENTS,
- g_print ("WM_%cBUTTONUP: %#x x,y: %d %d button: %d\n",
+ g_print ("WM_%cBUTTONUP: %#x (%d,%d)\n",
" LMR"[button],
xevent->hwnd,
- LOWORD (xevent->lParam), HIWORD (xevent->lParam),
- button));
+ LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
if (WINDOW_PRIVATE(window)->extension_events != 0
&& gdk_input_ignore_core)
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
p_grab_window, p_grab_owner_events, p_grab_mask,
- doesnt_want_button_release,
- mouse_propagate))
- break;
+ doesnt_want_button_release))
+ goto maybe_ungrab;
event->button.window = window;
#else
buttonup:
}
else
{
- window = mouse_propagate (window, xevent);
+ window = pointer_propagate (window, xevent);
/* Jump back up */
goto buttonup;
}
g_assert (event->button.window == window);
#endif
event->button.time = xevent->time;
- if (window == p_grab_window
- && p_grab_window != orig_window)
- {
- /* Translate coordinates to grabber */
- pt.x = LOWORD (xevent->lParam);
- pt.y = HIWORD (xevent->lParam);
- ClientToScreen (xevent->hwnd, &pt);
- ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
- event->button.x = pt.x;
- event->button.y = pt.y;
- GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
- }
- else
- {
- event->button.x = LOWORD (xevent->lParam);
- event->button.y = HIWORD (xevent->lParam);
- }
+ if (window != orig_window)
+ translate_mouse_coords (orig_window, window, xevent);
+ event->button.x = LOWORD (xevent->lParam);
+ event->button.y = HIWORD (xevent->lParam);
event->button.x_root = xevent->pt.x;
event->button.y_root = xevent->pt.y;
event->button.pressure = 0.5;
event->button.xtilt = 0;
event->button.ytilt = 0;
- event->button.state = 0;
- if (xevent->wParam & MK_CONTROL)
- event->button.state |= GDK_CONTROL_MASK;
- if (xevent->wParam & MK_LBUTTON)
- event->button.state |= GDK_BUTTON1_MASK;
- if (xevent->wParam & MK_MBUTTON)
- event->button.state |= GDK_BUTTON2_MASK;
- if (xevent->wParam & MK_RBUTTON)
- event->button.state |= GDK_BUTTON3_MASK;
- if (xevent->wParam & MK_SHIFT)
- event->button.state |= GDK_SHIFT_MASK;
- if (GetKeyState (VK_MENU) < 0)
- event->button.state |= GDK_MOD1_MASK;
- if (GetKeyState (VK_CAPITAL) & 0x1)
- event->button.state |= GDK_LOCK_MASK;
+ event->button.state = build_pointer_event_state (xevent);
event->button.button = button;
event->button.source = GDK_SOURCE_MOUSE;
event->button.deviceid = GDK_CORE_POINTER;
case WM_MOUSEMOVE:
GDK_NOTE (EVENTS,
- g_print ("WM_MOUSEMOVE: %#x %#x +%d+%d\n",
+ g_print ("WM_MOUSEMOVE: %#x %#x (%d,%d)\n",
xevent->hwnd, xevent->wParam,
LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
- /* HB: only process mouse move messages if we own the active window. */
+ /* If we haven't moved, don't create any event.
+ * Windows sends WM_MOUSEMOVE messages after button presses
+ * even if the mouse doesn't move. This disturbs gtk.
+ */
+ if (window == curWnd
+ && LOWORD (xevent->lParam) == curX
+ && HIWORD (xevent->lParam) == curY)
+ break;
+ /* HB: only process mouse move messages if we own the active window. */
GetWindowThreadProcessId(GetActiveWindow(), &pidActWin);
GetWindowThreadProcessId(xevent->hwnd, &pidThis);
if (pidActWin != pidThis)
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
p_grab_window, p_grab_owner_events, p_grab_mask,
- doesnt_want_button_motion,
- mouse_propagate))
+ doesnt_want_button_motion))
break;
event->motion.window = window;
#else
}
else
{
- window = mouse_propagate (window, xevent);
+ window = pointer_propagate (window, xevent);
/* Jump back up */
goto mousemotion;
}
event->motion.window = window;
#endif
event->motion.time = xevent->time;
- if (window == p_grab_window
- && p_grab_window != orig_window)
- {
- /* Translate coordinates to grabber */
- pt.x = curX = LOWORD (xevent->lParam);
- pt.y = curY = HIWORD (xevent->lParam);
- ClientToScreen (xevent->hwnd, &pt);
- ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
- event->motion.x = pt.x;
- event->motion.y = pt.y;
- GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
- }
- else
- {
- event->motion.x = curX = LOWORD (xevent->lParam);
- event->motion.y = curY = HIWORD (xevent->lParam);
- }
+ if (window != orig_window)
+ translate_mouse_coords (orig_window, window, xevent);
+ event->motion.x = curX = LOWORD (xevent->lParam);
+ event->motion.y = curY = HIWORD (xevent->lParam);
event->motion.x_root = xevent->pt.x;
event->motion.y_root = xevent->pt.y;
curXroot = event->motion.x_root;
event->motion.pressure = 0.5;
event->motion.xtilt = 0;
event->motion.ytilt = 0;
- event->button.state = 0;
- if (xevent->wParam & MK_CONTROL)
- event->button.state |= GDK_CONTROL_MASK;
- if (xevent->wParam & MK_LBUTTON)
- event->button.state |= GDK_BUTTON1_MASK;
- if (xevent->wParam & MK_MBUTTON)
- event->button.state |= GDK_BUTTON2_MASK;
- if (xevent->wParam & MK_RBUTTON)
- event->button.state |= GDK_BUTTON3_MASK;
- if (xevent->wParam & MK_SHIFT)
- event->button.state |= GDK_SHIFT_MASK;
- if (GetKeyState (VK_MENU) < 0)
- event->button.state |= GDK_MOD1_MASK;
- if (GetKeyState (VK_CAPITAL) & 0x1)
- event->button.state |= GDK_LOCK_MASK;
- if (mask & GDK_POINTER_MOTION_HINT_MASK)
- event->motion.is_hint = NotifyHint;
- else
- event->motion.is_hint = NotifyNormal;
+ event->motion.state = build_pointer_event_state (xevent);
+ event->motion.is_hint = FALSE;
event->motion.source = GDK_SOURCE_MOUSE;
event->motion.deviceid = GDK_CORE_POINTER;
break;
case WM_MOVE:
- GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x +%d+%d\n",
+ GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x (%d,%d)\n",
xevent->hwnd,
LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
#include <windows.h>
-#ifdef HAVE_WINTAB
-#include <wintab.h>
-#endif
-
#include <objbase.h>
#include <imm.h>
#include "surrogate-dimm.h"
#endif
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#endif
+
#include "gdk.h"
#include "gdkx.h"
#endif
}
-/************************
- * Exposure compression *
- ************************/
-
-/* I don't bother with exposure compression on Win32. Windows compresses
- * WM_PAINT events by itself.
- */
-
/*************************************************************
* gdk_event_handler_set:
*
}
}
+static gint
+build_pointer_event_state (MSG *xevent)
+{
+ gint state;
+
+ state = 0;
+ if (xevent->wParam & MK_CONTROL)
+ state |= GDK_CONTROL_MASK;
+ if (xevent->wParam & MK_LBUTTON)
+ state |= GDK_BUTTON1_MASK;
+ if (xevent->wParam & MK_MBUTTON)
+ state |= GDK_BUTTON2_MASK;
+ if (xevent->wParam & MK_RBUTTON)
+ state |= GDK_BUTTON3_MASK;
+ if (xevent->wParam & MK_SHIFT)
+ state |= GDK_SHIFT_MASK;
+ if (GetKeyState (VK_MENU) < 0)
+ state |= GDK_MOD1_MASK;
+ if (GetKeyState (VK_CAPITAL) & 0x1)
+ state |= GDK_LOCK_MASK;
+
+ return state;
+}
+
+
static void
build_keypress_event (GdkWindowPrivate *window_private,
GdkEvent *event,
event->expose.count);
break;
case GDK_MOTION_NOTIFY:
+ g_print ("(%.4g,%.4g) %s",
+ event->motion.x, event->motion.y,
+ event->motion.is_hint ? "HINT " : "");
print_event_state (event->motion.state);
break;
case GDK_BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS:
+ case GDK_3BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
- g_print ("%d ", event->button.button);
+ g_print ("%d (%.4g,%.4g) ",
+ event->button.button,
+ event->button.x, event->button.y);
print_event_state (event->button.state);
break;
case GDK_KEY_PRESS:
synthesize_crossing_events (GdkWindow *window,
MSG *xevent)
{
- TRACKMOUSEEVENT tme;
GdkEvent *event;
/* If we are not using TrackMouseEvent, generate a leave notify
gdk_window_unref (curWnd);
curWnd = window;
gdk_window_ref (curWnd);
+#ifdef USE_TRACKMOUSEEVENT
if (p_TrackMouseEvent != NULL)
{
+ TRACKMOUSEEVENT tme;
+
tme.cbSize = sizeof (TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = GDK_DRAWABLE_XID (curWnd);
(*p_TrackMouseEvent) (&tme);
}
+#endif
}
+#ifndef NEW_PROPAGATION_CODE
+
static GdkWindow *
key_propagate (GdkWindow *window,
MSG *xevent)
gdk_window_unref (window);
window = WINDOW_PRIVATE(window)->parent;
gdk_window_ref (window);
- GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
- GDK_DRAWABLE_XID (window)));
return window;
}
static GdkWindow *
-mouse_propagate (GdkWindow *window,
- MSG *xevent)
+pointer_propagate (GdkWindow *window,
+ MSG *xevent)
{
POINT pt;
gdk_window_ref (window);
ScreenToClient (GDK_DRAWABLE_XID (window), &pt);
xevent->lParam = MAKELPARAM (pt.x, pt.y);
- GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
- GDK_DRAWABLE_XID (window)));
+
return window;
}
+#endif /* !NEW_PROPAGATION_CODE */
+
+static void
+translate_mouse_coords (GdkWindow *window1,
+ GdkWindow *window2,
+ MSG *xevent)
+{
+ POINT pt;
+
+ pt.x = LOWORD (xevent->lParam);
+ pt.y = HIWORD (xevent->lParam);
+ ClientToScreen (GDK_DRAWABLE_XID (window1), &pt);
+ ScreenToClient (GDK_DRAWABLE_XID (window2), &pt);
+ xevent->lParam = MAKELPARAM (pt.x, pt.y);
+ GDK_NOTE (EVENTS, g_print ("...new coords are (%d,%d)\n", pt.x, pt.y));
+}
+
#ifdef NEW_PROPAGATION_CODE
static gboolean
gboolean grab_owner_events,
gint grab_mask,
gboolean (*doesnt_want_it) (gint mask,
- MSG *xevent),
- GdkWindow *(*propagate) (GdkWindow *window,
- MSG *xevent))
+ MSG *xevent))
{
if (grab_window != NULL && !grab_owner_events)
{
}
else
{
- GDK_NOTE (EVENTS, "...undelivered\n");
+ GDK_NOTE (EVENTS, g_print ("...undelivered\n"));
return FALSE;
}
}
else
{
- *window = (*propagate) (*window, xevent);
+ gdk_window_unref (*window);
+ *window = WINDOW_PRIVATE(*window)->parent;
+ gdk_window_ref (*window);
GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
GDK_DRAWABLE_XID (*window)));
/* The only branch where we actually continue the loop */
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
- doesnt_want_key,
- key_propagate))
+ doesnt_want_key))
break;
event->key.window = window;
#else
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK,
- doesnt_want_char,
- key_propagate))
+ doesnt_want_char))
break;
event->key.window = window;
#else
buttondown0:
GDK_NOTE (EVENTS,
- g_print ("WM_%cBUTTONDOWN: %#x x,y: %d %d button: %d\n",
+ g_print ("WM_%cBUTTONDOWN: %#x (%d,%d)\n",
" LMR"[button],
xevent->hwnd,
- LOWORD (xevent->lParam), HIWORD (xevent->lParam),
- button));
+ LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
if (WINDOW_PRIVATE(window)->extension_events != 0
&& gdk_input_ignore_core)
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
p_grab_window, p_grab_owner_events, p_grab_mask,
- doesnt_want_button_press,
- mouse_propagate))
+ doesnt_want_button_press))
break;
event->button.window = window;
#else
}
else
{
- window = mouse_propagate (window, xevent);
+ window = pointer_propagate (window, xevent);
/* Jump back up */
goto buttondown; /* What did Dijkstra say? */
}
}
event->button.time = xevent->time;
- if (window == p_grab_window
- && p_grab_window != orig_window)
- {
- /* Translate coordinates to grabber */
- pt.x = LOWORD (xevent->lParam);
- pt.y = HIWORD (xevent->lParam);
- ClientToScreen (xevent->hwnd, &pt);
- ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
- event->button.x = pt.x;
- event->button.y = pt.y;
- GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
- }
- else
- {
- event->button.x = LOWORD (xevent->lParam);
- event->button.y = HIWORD (xevent->lParam);
- }
+ if (window != orig_window)
+ translate_mouse_coords (orig_window, window, xevent);
+ event->button.x = curX = LOWORD (xevent->lParam);
+ event->button.y = curY = HIWORD (xevent->lParam);
event->button.x_root = xevent->pt.x;
event->button.y_root = xevent->pt.y;
event->button.pressure = 0.5;
event->button.xtilt = 0;
event->button.ytilt = 0;
- event->button.state = 0;
- if (xevent->wParam & MK_CONTROL)
- event->button.state |= GDK_CONTROL_MASK;
- if (xevent->wParam & MK_LBUTTON)
- event->button.state |= GDK_BUTTON1_MASK;
- if (xevent->wParam & MK_MBUTTON)
- event->button.state |= GDK_BUTTON2_MASK;
- if (xevent->wParam & MK_RBUTTON)
- event->button.state |= GDK_BUTTON3_MASK;
- if (xevent->wParam & MK_SHIFT)
- event->button.state |= GDK_SHIFT_MASK;
- if (GetKeyState (VK_MENU) < 0)
- event->button.state |= GDK_MOD1_MASK;
- if (GetKeyState (VK_CAPITAL) & 0x1)
- event->button.state |= GDK_LOCK_MASK;
+ event->button.state = build_pointer_event_state (xevent);
event->button.button = button;
event->button.source = GDK_SOURCE_MOUSE;
event->button.deviceid = GDK_CORE_POINTER;
buttonup0:
GDK_NOTE (EVENTS,
- g_print ("WM_%cBUTTONUP: %#x x,y: %d %d button: %d\n",
+ g_print ("WM_%cBUTTONUP: %#x (%d,%d)\n",
" LMR"[button],
xevent->hwnd,
- LOWORD (xevent->lParam), HIWORD (xevent->lParam),
- button));
+ LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
if (WINDOW_PRIVATE(window)->extension_events != 0
&& gdk_input_ignore_core)
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
p_grab_window, p_grab_owner_events, p_grab_mask,
- doesnt_want_button_release,
- mouse_propagate))
- break;
+ doesnt_want_button_release))
+ goto maybe_ungrab;
event->button.window = window;
#else
buttonup:
}
else
{
- window = mouse_propagate (window, xevent);
+ window = pointer_propagate (window, xevent);
/* Jump back up */
goto buttonup;
}
g_assert (event->button.window == window);
#endif
event->button.time = xevent->time;
- if (window == p_grab_window
- && p_grab_window != orig_window)
- {
- /* Translate coordinates to grabber */
- pt.x = LOWORD (xevent->lParam);
- pt.y = HIWORD (xevent->lParam);
- ClientToScreen (xevent->hwnd, &pt);
- ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
- event->button.x = pt.x;
- event->button.y = pt.y;
- GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
- }
- else
- {
- event->button.x = LOWORD (xevent->lParam);
- event->button.y = HIWORD (xevent->lParam);
- }
+ if (window != orig_window)
+ translate_mouse_coords (orig_window, window, xevent);
+ event->button.x = LOWORD (xevent->lParam);
+ event->button.y = HIWORD (xevent->lParam);
event->button.x_root = xevent->pt.x;
event->button.y_root = xevent->pt.y;
event->button.pressure = 0.5;
event->button.xtilt = 0;
event->button.ytilt = 0;
- event->button.state = 0;
- if (xevent->wParam & MK_CONTROL)
- event->button.state |= GDK_CONTROL_MASK;
- if (xevent->wParam & MK_LBUTTON)
- event->button.state |= GDK_BUTTON1_MASK;
- if (xevent->wParam & MK_MBUTTON)
- event->button.state |= GDK_BUTTON2_MASK;
- if (xevent->wParam & MK_RBUTTON)
- event->button.state |= GDK_BUTTON3_MASK;
- if (xevent->wParam & MK_SHIFT)
- event->button.state |= GDK_SHIFT_MASK;
- if (GetKeyState (VK_MENU) < 0)
- event->button.state |= GDK_MOD1_MASK;
- if (GetKeyState (VK_CAPITAL) & 0x1)
- event->button.state |= GDK_LOCK_MASK;
+ event->button.state = build_pointer_event_state (xevent);
event->button.button = button;
event->button.source = GDK_SOURCE_MOUSE;
event->button.deviceid = GDK_CORE_POINTER;
case WM_MOUSEMOVE:
GDK_NOTE (EVENTS,
- g_print ("WM_MOUSEMOVE: %#x %#x +%d+%d\n",
+ g_print ("WM_MOUSEMOVE: %#x %#x (%d,%d)\n",
xevent->hwnd, xevent->wParam,
LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
- /* HB: only process mouse move messages if we own the active window. */
+ /* If we haven't moved, don't create any event.
+ * Windows sends WM_MOUSEMOVE messages after button presses
+ * even if the mouse doesn't move. This disturbs gtk.
+ */
+ if (window == curWnd
+ && LOWORD (xevent->lParam) == curX
+ && HIWORD (xevent->lParam) == curY)
+ break;
+ /* HB: only process mouse move messages if we own the active window. */
GetWindowThreadProcessId(GetActiveWindow(), &pidActWin);
GetWindowThreadProcessId(xevent->hwnd, &pidThis);
if (pidActWin != pidThis)
#ifdef NEW_PROPAGATION_CODE
if (!propagate (&window, xevent,
p_grab_window, p_grab_owner_events, p_grab_mask,
- doesnt_want_button_motion,
- mouse_propagate))
+ doesnt_want_button_motion))
break;
event->motion.window = window;
#else
}
else
{
- window = mouse_propagate (window, xevent);
+ window = pointer_propagate (window, xevent);
/* Jump back up */
goto mousemotion;
}
event->motion.window = window;
#endif
event->motion.time = xevent->time;
- if (window == p_grab_window
- && p_grab_window != orig_window)
- {
- /* Translate coordinates to grabber */
- pt.x = curX = LOWORD (xevent->lParam);
- pt.y = curY = HIWORD (xevent->lParam);
- ClientToScreen (xevent->hwnd, &pt);
- ScreenToClient (GDK_DRAWABLE_XID (p_grab_window), &pt);
- event->motion.x = pt.x;
- event->motion.y = pt.y;
- GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
- }
- else
- {
- event->motion.x = curX = LOWORD (xevent->lParam);
- event->motion.y = curY = HIWORD (xevent->lParam);
- }
+ if (window != orig_window)
+ translate_mouse_coords (orig_window, window, xevent);
+ event->motion.x = curX = LOWORD (xevent->lParam);
+ event->motion.y = curY = HIWORD (xevent->lParam);
event->motion.x_root = xevent->pt.x;
event->motion.y_root = xevent->pt.y;
curXroot = event->motion.x_root;
event->motion.pressure = 0.5;
event->motion.xtilt = 0;
event->motion.ytilt = 0;
- event->button.state = 0;
- if (xevent->wParam & MK_CONTROL)
- event->button.state |= GDK_CONTROL_MASK;
- if (xevent->wParam & MK_LBUTTON)
- event->button.state |= GDK_BUTTON1_MASK;
- if (xevent->wParam & MK_MBUTTON)
- event->button.state |= GDK_BUTTON2_MASK;
- if (xevent->wParam & MK_RBUTTON)
- event->button.state |= GDK_BUTTON3_MASK;
- if (xevent->wParam & MK_SHIFT)
- event->button.state |= GDK_SHIFT_MASK;
- if (GetKeyState (VK_MENU) < 0)
- event->button.state |= GDK_MOD1_MASK;
- if (GetKeyState (VK_CAPITAL) & 0x1)
- event->button.state |= GDK_LOCK_MASK;
- if (mask & GDK_POINTER_MOTION_HINT_MASK)
- event->motion.is_hint = NotifyHint;
- else
- event->motion.is_hint = NotifyNormal;
+ event->motion.state = build_pointer_event_state (xevent);
+ event->motion.is_hint = FALSE;
event->motion.source = GDK_SOURCE_MOUSE;
event->motion.deviceid = GDK_CORE_POINTER;
break;
case WM_MOVE:
- GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x +%d+%d\n",
+ GDK_NOTE (EVENTS, g_print ("WM_MOVE: %#x (%d,%d)\n",
xevent->hwnd,
LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
GdkFont*
gdk_font_load (const gchar *font_name)
{
- return gdk_font_load_internal (GDK_FONT_FONT, font_name);
+ /* Load all fonts as fontsets... Gtktext and gtkentry work better
+ * that way, they use wide chars, which is necessary for non-ASCII
+ * chars to work. (Yes, even Latin-1, as we use Unicode internally.)
+ */
+ return gdk_font_load_internal (GDK_FONT_FONTSET, font_name);
}
GdkFont*
GdkFont*
gdk_font_load (const gchar *font_name)
{
- return gdk_font_load_internal (GDK_FONT_FONT, font_name);
+ /* Load all fonts as fontsets... Gtktext and gtkentry work better
+ * that way, they use wide chars, which is necessary for non-ASCII
+ * chars to work. (Yes, even Latin-1, as we use Unicode internally.)
+ */
+ return gdk_font_load_internal (GDK_FONT_FONTSET, font_name);
}
GdkFont*
GMutex *gdk_threads_mutex = NULL; /* Global GDK lock */
-BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme) = NULL;
-
+PFN_TrackMouseEvent p_TrackMouseEvent = NULL;
GMutex *gdk_threads_mutex = NULL; /* Global GDK lock */
-BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme) = NULL;
-
+PFN_TrackMouseEvent p_TrackMouseEvent = NULL;
#define STRICT /* We want strict type checks */
#include <windows.h>
+#include <commctrl.h>
/* Make up for some minor mingw32 lossage */
#define AllocNone 0
#define AllocAll 1
-/* Notify modes */
-#define NotifyNormal 0
-#define NotifyHint 1
-
/* Some structs are somewhat useful to emulate internally, just to
keep the code less #ifdefed. */
typedef struct {
extern GdkAtom gdk_clipboard_atom;
extern GdkAtom gdk_win32_dropfiles_atom;
extern GdkAtom gdk_ole2_dnd_atom;
-extern BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme);
+
+typedef BOOL (WINAPI *PFN_TrackMouseEvent) (LPTRACKMOUSEEVENT);
+extern PFN_TrackMouseEvent p_TrackMouseEvent;
extern LRESULT CALLBACK gdk_WindowProc (HWND, UINT, WPARAM, LPARAM);
#define STRICT /* We want strict type checks */
#include <windows.h>
+#include <commctrl.h>
/* Make up for some minor mingw32 lossage */
#define AllocNone 0
#define AllocAll 1
-/* Notify modes */
-#define NotifyNormal 0
-#define NotifyHint 1
-
/* Some structs are somewhat useful to emulate internally, just to
keep the code less #ifdefed. */
typedef struct {
extern GdkAtom gdk_clipboard_atom;
extern GdkAtom gdk_win32_dropfiles_atom;
extern GdkAtom gdk_ole2_dnd_atom;
-extern BOOL (WINAPI *p_TrackMouseEvent) (TRACKMOUSEEVENT *tme);
+
+typedef BOOL (WINAPI *PFN_TrackMouseEvent) (LPTRACKMOUSEEVENT);
+extern PFN_TrackMouseEvent p_TrackMouseEvent;
extern LRESULT CALLBACK gdk_WindowProc (HWND, UINT, WPARAM, LPARAM);
TCI_SRCCODEPAGE);
titlelen = strlen (title);
- wctitle = g_new (wchar_t, titlelen);
+ wctitle = g_new (wchar_t, titlelen + 1);
mbtitle = g_new (char, 3*titlelen + 1);
wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
- WideCharToMultiByte (GetACP (), 0, wctitle, wlen,
+ wctitle[wlen] = 0;
+ WideCharToMultiByte (GetACP (), 0, wctitle, -1,
mbtitle, 3*titlelen, NULL, NULL);
private->drawable.xwindow =
gdk_ProgInstance,
NULL);
- g_free (mbtitle);
- g_free (wctitle);
-
- if (private->drawable.xwindow == NULL)
- {
- g_warning ("gdk_window_create: CreateWindowEx failed");
- g_free (private);
- return NULL;
- }
-
GDK_NOTE (MISC,
g_print ("gdk_window_create: %s %s %dx%d@+%d+%d %#x = %#x\n"
"...locale %#x codepage %d\n",
(private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
(private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
"???")))),
- title,
+ mbtitle,
width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
xparent,
private->drawable.xwindow,
private->input_locale,
private->charset_info.ciACP));
+ g_free (mbtitle);
+ g_free (wctitle);
+
+ if (private->drawable.xwindow == NULL)
+ {
+ g_warning ("gdk_window_create: CreateWindowEx failed");
+ g_free (private);
+ return NULL;
+ }
+
gdk_window_ref (window);
gdk_xid_table_insert (&private->drawable.xwindow, window);
* to the system codepage.
*/
titlelen = strlen (title);
- wcstr = g_new (wchar_t, titlelen);
+ wcstr = g_new (wchar_t, titlelen + 1);
mbstr = g_new (char, 3*titlelen + 1);
wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
- WideCharToMultiByte (GetACP (), 0, wcstr, wlen,
+ wcstr[wlen] = 0;
+ WideCharToMultiByte (GetACP (), 0, wcstr, -1,
mbstr, 3*titlelen, NULL, NULL);
if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
TCI_SRCCODEPAGE);
titlelen = strlen (title);
- wctitle = g_new (wchar_t, titlelen);
+ wctitle = g_new (wchar_t, titlelen + 1);
mbtitle = g_new (char, 3*titlelen + 1);
wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
- WideCharToMultiByte (GetACP (), 0, wctitle, wlen,
+ wctitle[wlen] = 0;
+ WideCharToMultiByte (GetACP (), 0, wctitle, -1,
mbtitle, 3*titlelen, NULL, NULL);
private->drawable.xwindow =
gdk_ProgInstance,
NULL);
- g_free (mbtitle);
- g_free (wctitle);
-
- if (private->drawable.xwindow == NULL)
- {
- g_warning ("gdk_window_create: CreateWindowEx failed");
- g_free (private);
- return NULL;
- }
-
GDK_NOTE (MISC,
g_print ("gdk_window_create: %s %s %dx%d@+%d+%d %#x = %#x\n"
"...locale %#x codepage %d\n",
(private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
(private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
"???")))),
- title,
+ mbtitle,
width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
xparent,
private->drawable.xwindow,
private->input_locale,
private->charset_info.ciACP));
+ g_free (mbtitle);
+ g_free (wctitle);
+
+ if (private->drawable.xwindow == NULL)
+ {
+ g_warning ("gdk_window_create: CreateWindowEx failed");
+ g_free (private);
+ return NULL;
+ }
+
gdk_window_ref (window);
gdk_xid_table_insert (&private->drawable.xwindow, window);
* to the system codepage.
*/
titlelen = strlen (title);
- wcstr = g_new (wchar_t, titlelen);
+ wcstr = g_new (wchar_t, titlelen + 1);
mbstr = g_new (char, 3*titlelen + 1);
wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
- WideCharToMultiByte (GetACP (), 0, wcstr, wlen,
+ wcstr[wlen] = 0;
+ WideCharToMultiByte (GetACP (), 0, wcstr, -1,
mbstr, 3*titlelen, NULL, NULL);
if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
gdk.o \
gdkcc.o \
gdkcolor.o \
- gdkcompat.o \
gdkcursor.o \
gdkdnd.o \
gdkdraw.o \
!IFNDEF DEBUG
# Full optimization:
OPTIMIZE = -Ox -MD
-LINKDEBUG =
+LINKDEBUG = /nodefaultlib:libc.lib
!ELSE
# Debugging:
OPTIMIZE = -Zi -MDd
-LINKDEBUG = /debug
+LINKDEBUG = /defaultlib:libcd.lib /debug
!ENDIF
# cl -? describes the options
gdk.obj \
gdkcc.obj \
gdkcolor.obj \
- gdkcompat.obj \
gdkcursor.obj \
gdkdnd.obj \
gdkdraw.obj \
gint n_locale_suffixes = 0;
gint i, j;
#ifdef G_OS_WIN32
- char *locale = gwin_getlocale ();
+ char *locale = g_win32_getlocale ();
#else
#ifdef HAVE_LC_MESSAGES
char *locale = setlocale (LC_MESSAGES, NULL);